package com.shujia.scala

// Scala中的class类可以不和文件名保持一致，并且可以在同一个Scala文件中同时定义多个class
// 注意：同一个包下不同的.scala文件中不能定义同名的class
// Scala中创建class的时候是没有public修饰符
class Demo13ScalaCLass01(id: String, name: String, age: Int) // 默认构造方法
{
  println("默认的构造方法")
  // 在class中可以定义属性以及方法

  // 定义属性
  /**
   * Scala的class中定义的所有属性都是默认都是private，val修饰的属性反编译后还会由final修饰符
   * 在Scala中去取类的对象的属性时，并不是直接取，而是通过类似Java中的get方法（同属性名称一样的方法）取
   *
   * 同样的Scala的class中的属性也能用private、protected修饰，修饰后会将同属性名称一样的方法加上权限修饰
   */
  private val _id: String = id
  protected val _name: String = name
  val _age: Int = age
  // 定义属性不在默认的构造方法中初始化
  var _clazz: String = _
  var _height: Int = _

  def getName():String = {
    this._name
  }

  def setClazz(clazz: String): Unit = {
    this._clazz = clazz
  }

  // 重载构造方法
  def this(id: String, name: String, age: Int, clazz: String) = {
    // 调用默认的构造方法
    this(id, name, age) // 重载的构造方法中第一行代码必须调用默认的构造方法this()
    this._clazz = clazz
    println("重载的构造方法")
  }

  // 重写toString方法，可以改变println输出的结果
  override def toString: String = {
    s"${this._id},${this._name},${this._age},${this._clazz},${this._height}"
  }

}

class Demo13ScalaCLass02 {

}

class Demo13ScalaCLass03 {

}

// 伴生对象
object Demo13ScalaCLass01 {
  def main(args: Array[String]): Unit = {
    // 创建类的对象
    val zs: Demo13ScalaCLass01 = new Demo13ScalaCLass01("001", "zs", 23)
    println(zs._id)
    println(zs._name)
    println(zs._age)
    println(zs._clazz)
    println(zs._height)
    // 调用方法
    zs.setClazz("文科一班")
    println(zs._clazz)

    val ls: Demo13ScalaCLass01 = new Demo13ScalaCLass01("002", "ls", 22, "理科四班")
    println(ls._clazz)
    println(ls._height)

    ls.setClazz("理科三班")
    println(ls._clazz)

    println(zs) // 默认情况下直接打印对象会得到内存地址
    println(ls)

    //    var id:String = _  // 只能在class中定义成员属性时才能先不进行初始化

  }
}
